<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
</head>

<body>
    <pre>

    ★★★★★

    原型(__proto__)和构造函数(prototype)的原型对象里面都有一个属性 constructor 属性
    constructor 我们称为构造函数，因为它指回构造函数本身。

    constructor 主要用于记录该对象引用于哪个构造函数，[它可以让原型对象重新指向原来的构造函数]。

    一般情况下，实例对象的方法都在构造函数的原型对象中设置。
    如果有多个对象的方法，我们可以给原型对象采取对象形式赋值，但是这样就会覆盖构造函数原型对象原来的内容，
    这样修改后的原型对象 constructor 就不再指向当前构造函数了。
    此时，我们可以在修改后的原型对象中，添加一个 constructor 指向原来的构造函数
  </pre
    >

    <script>
      function Person(name, age) {}

      // Person.prototype.sayHi = function () {
      //   console.log('Hi~你好')
      // }

      // Person.prototype.sayHello = function () {
      //   console.log('Hi~你好啊~~~')
      // }

      // const per1 = new Person()
      // // 原型对象上一一个属性，指向构造本身
      // console.log(per1.__proto__.constructor)

      // 如果我们修改了原来的原型对象, 给原型对象赋值的是一个对象,
      // // 则必须手动的利用constructor指回原来的构造函数
      Person.prototype = {
        constructor: Person,
        sayHi: function () {
          console.log("Hi~你好");
        },
        sayHello: function () {
          console.log("Hi~你好啊~~~");
        },
      };

      var man = new Person();
      man.sayHi();

      console.dir(man.__proto__.constructor);
      console.dir(Person.prototype.constructor);
    </script>
  </body>
</html>